home *** CD-ROM | disk | FTP | other *** search
/ Enter 2006 September / Enter 09 2006.iso / Internet / SpamExperts Home 1.1 / SpamExperts Home.exe / lib / spamexperts.modules / ZODB / ExportImport.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-07-14  |  4.4 KB  |  149 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''Support for database export and import.'''
  5. from cStringIO import StringIO
  6. from cPickle import Pickler, Unpickler
  7. from tempfile import TemporaryFile
  8. import logging
  9. from ZODB.POSException import ExportError
  10. from ZODB.utils import p64, u64
  11. from ZODB.serialize import referencesf
  12. logger = logging.getLogger('ZODB.ExportImport')
  13.  
  14. class ExportImport:
  15.     
  16.     def exportFile(self, oid, f = None):
  17.         if f is None:
  18.             f = TemporaryFile()
  19.         elif isinstance(f, str):
  20.             f = open(f, 'w+b')
  21.         
  22.         f.write('ZEXP')
  23.         oids = [
  24.             oid]
  25.         done_oids = { }
  26.         done = done_oids.has_key
  27.         load = self._storage.load
  28.         while oids:
  29.             oid = oids.pop(0)
  30.             if oid in done_oids:
  31.                 continue
  32.             
  33.             done_oids[oid] = True
  34.             
  35.             try:
  36.                 (p, serial) = load(oid, self._version)
  37.             except:
  38.                 logger.debug('broken reference for oid %s', repr(oid), exc_info = True)
  39.                 continue
  40.  
  41.             referencesf(p, oids)
  42.             f.writelines([
  43.                 oid,
  44.                 p64(len(p)),
  45.                 p])
  46.         f.write(export_end_marker)
  47.         return f
  48.  
  49.     
  50.     def importFile(self, f, clue = '', customImporters = None):
  51.         if isinstance(f, str):
  52.             f = open(f, 'rb')
  53.         
  54.         magic = f.read(4)
  55.         if magic != 'ZEXP':
  56.             if customImporters and customImporters.has_key(magic):
  57.                 f.seek(0)
  58.                 return customImporters[magic](self, f, clue)
  59.             
  60.             raise ExportError('Invalid export header')
  61.         
  62.         t = self.transaction_manager.get()
  63.         if clue:
  64.             t.note(clue)
  65.         
  66.         return_oid_list = []
  67.         self._import = (f, return_oid_list)
  68.         self._register()
  69.         t.savepoint(optimistic = True)
  70.         if return_oid_list:
  71.             return self.get(return_oid_list[0])
  72.         else:
  73.             return None
  74.  
  75.     
  76.     def _importDuringCommit(self, transaction, f, return_oid_list):
  77.         '''Import data during two-phase commit.
  78.  
  79.         Invoked by the transaction manager mid commit.
  80.         Appends one item, the OID of the first object created,
  81.         to return_oid_list.
  82.         '''
  83.         oids = { }
  84.         
  85.         def persistent_load(ooid):
  86.             '''Remap a persistent id to a new ID and create a ghost for it.'''
  87.             klass = None
  88.             if isinstance(ooid, tuple):
  89.                 (ooid, klass) = ooid
  90.             
  91.             if ooid in oids:
  92.                 oid = oids[ooid]
  93.             elif klass is None:
  94.                 oid = self._storage.new_oid()
  95.             else:
  96.                 oid = (self._storage.new_oid(), klass)
  97.             oids[ooid] = oid
  98.             return Ghost(oid)
  99.  
  100.         version = self._version
  101.         while None:
  102.             h = f.read(16)
  103.             if h == export_end_marker:
  104.                 break
  105.             
  106.             if len(h) != 16:
  107.                 raise ExportError('Truncated export file')
  108.             
  109.             l = u64(h[8:16])
  110.             p = f.read(l)
  111.             if len(p) != l:
  112.                 raise ExportError('Truncated export file')
  113.             
  114.             ooid = h[:8]
  115.             if oids:
  116.                 oid = oids[ooid]
  117.                 if isinstance(oid, tuple):
  118.                     oid = oid[0]
  119.                 
  120.             else:
  121.                 oids[ooid] = oid = self._storage.new_oid()
  122.                 return_oid_list.append(oid)
  123.             pfile = StringIO(p)
  124.             unpickler = Unpickler(pfile)
  125.             unpickler.persistent_load = persistent_load
  126.             newp = StringIO()
  127.             pickler = Pickler(newp, 1)
  128.             pickler.persistent_id = persistent_id
  129.             pickler.dump(unpickler.load())
  130.             p = newp.getvalue()
  131.             self._storage.store(oid, None, p, version, transaction)
  132.  
  133.  
  134. export_end_marker = '\xff' * 16
  135.  
  136. class Ghost(object):
  137.     __slots__ = ('oid',)
  138.     
  139.     def __init__(self, oid):
  140.         self.oid = oid
  141.  
  142.  
  143.  
  144. def persistent_id(obj):
  145.     if isinstance(obj, Ghost):
  146.         return obj.oid
  147.     
  148.  
  149.